<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<script>
    /* 1.用构造函数创建对象 很少用
    *       函数 function 也是一个对象，可以封装一些功能（代码） 需要时 可以执行这些功能（代码）
    *        封装在函数中的代码不立即执行
    *       函数中的代码在函数调用的时候执行
    *       调用函数语法:函数名();
    *       当调用函数时，函数中封装的代码会按顺序执行，
    *   2.使用函数声明创建对象
    *       语法:function 函数名([形参1，形参2....形参N]){
    *               语法.......
    *              }
    *       可以在()中指定一个或多个参数(形式参数) 多个形参之间用,逗号隔开，声明参数就相当于函数内部声明的变量
    *       但是并不赋值
    *           1.调用函数时可以在()中指定实参(实际参数) 实参将赋值给函数中的形参
    *           2.调用函数时解析器不会检查实参的类型
    *           所以注意的是：是否有可能接收非法的数据，如果有可能则需要对参数进行类型检查
    *           3.调用函数时解析器不会检查实参的数量，多余的不会被赋值
    *               如果实参的数量少于形参的数量，则没有对应的形参将是undefined
    *           4.函数的实参可以是任意数据类型
    *   3.使用函数表达式来创建一个函数
    *       var 函数名=function([形参1，形参2...]){
    *               语句.....
    *              }
    *       函数被引用 那它本身就是一个 函数
    *       函数被执行，那它本身就是一个对象
    * */
    //举例1创建一个函数对象 可以将要封装的代码以字符串的形式传递给构造函数
    var fun=new Function ("console.log('hello 这是我的第一个函数');")//这种用的很少
    fun();//调用函数
    //举例2
    function fun2() {
         console.log("这是第二个函数");
        alert("小甜甜");
        document.write("哈哈哈哈");
   }
    console.log(fun2);//不加括号，展示定义过程 封装的内容不执行，装子弹不开枪
    fun2();//加括号 按照顺序执行
    //举例3
    var fun3=function () {
    console.log("我是一个匿名函数");
    }
    fun3();
    //举例4
    function sum(a,b) {
        console.log(a+b);
    }
    sum(1,5);// 调用函数时可以在()中指定实参(实际参数) 实参将赋值给函数中的形参
    sum(123,235);
    sum(123,"hello");//调用函数时解析器不会检查实参的类型
    //所以注意的是：是否有可能接收非法的数据，如果有可能则需要对参数进行类型检查
    sum(123,789,true,null,"hello");//调用函数时解析器不会检查实参的数量，多余的不会被赋值
</script>
</body>
</html>